home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- *
- * PalmDock -- an OS X Dock for your Palm
- *
- * Rob Tsuk
- * Nevin “:-)” Liber
- * Sanford Selznick
- *
- *****************************************************************************/
-
- #include <PalmOS.h>
- #include "StarterRsc.h"
-
- #include <vector>
- #include <string>
-
- using std::vector;
- using std::string;
-
- vector<MemHandle> gSmallIcons;
- vector<MemHandle> gLargeIcons;
- vector<Coord> gIconLefts;
- vector<UInt32> gCreators;
- vector<string> gNames;
-
- static Int32 gTappedIcon = -1;
- Boolean gDragging = false;
-
- static void LoadIcons();
- static void DrawIcons();
-
- /***********************************************************************
- *
- * Entry Points
- *
- ***********************************************************************/
-
-
- /***********************************************************************
- *
- * Internal Structures
- *
- ***********************************************************************/
- typedef struct
- {
- UInt8 replaceme;
- } StarterPreferenceType;
-
- typedef struct
- {
- UInt8 replaceme;
- } StarterAppInfoType;
-
- typedef StarterAppInfoType* StarterAppInfoPtr;
-
-
- /***********************************************************************
- *
- * Global variables
- *
- ***********************************************************************/
- //static Boolean HideSecretRecords;
-
-
- /***********************************************************************
- *
- * Internal Constants
- *
- ***********************************************************************/
- #define appFileCreator 'STRT'
- #define appVersionNum 0x01
- #define appPrefID 0x00
- #define appPrefVersionNum 0x01
-
- // Define the minimum OS version we support (2.0 for now).
- #define ourMinVersion sysMakeROMVersion(2,0,0,sysROMStageRelease,0)
-
-
- /***********************************************************************
- *
- * Internal Functions
- *
- ***********************************************************************/
-
-
- /***********************************************************************
- *
- * FUNCTION: RomVersionCompatible
- *
- * DESCRIPTION: This routine checks that a ROM version is meet your
- * minimum requirement.
- *
- * PARAMETERS: requiredVersion - minimum rom version required
- * (see sysFtrNumROMVersion in SystemMgr.h
- * for format)
- * launchFlags - flags that indicate if the application
- * UI is initialized.
- *
- * RETURNED: error code or zero if rom is compatible
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static Err RomVersionCompatible(UInt32 requiredVersion, UInt16 launchFlags)
- {
- UInt32 romVersion;
-
- // See if we're on in minimum required version of the ROM or later.
- FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion);
- if (romVersion < requiredVersion)
- {
- if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) ==
- (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp))
- {
- FrmAlert (RomIncompatibleAlert);
-
- // Palm OS 1.0 will continuously relaunch this app unless we switch to
- // another safe one.
- if (romVersion < ourMinVersion)
- {
- AppLaunchWithCommand(sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL);
- }
- }
-
- return sysErrRomIncompatible;
- }
-
- return errNone;
- }
-
-
- /***********************************************************************
- *
- * FUNCTION: GetObjectPtr
- *
- * DESCRIPTION: This routine returns a pointer to an object in the current
- * form.
- *
- * PARAMETERS: formId - id of the form to display
- *
- * RETURNED: void *
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static void * GetObjectPtr(UInt16 objectID)
- {
- FormPtr frmP;
-
- frmP = FrmGetActiveForm();
- return FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, objectID));
- }
-
-
- /***********************************************************************
- *
- * FUNCTION: MainFormInit
- *
- * DESCRIPTION: This routine initializes the MainForm form.
- *
- * PARAMETERS: frm - pointer to the MainForm form.
- *
- * RETURNED: nothing
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static void MainFormInit(FormPtr /*frmP*/)
- {
- }
-
-
-
- static void MakeDocWindow()
- {
- }
-
-
- /***********************************************************************
- *
- * FUNCTION: MainFormDoCommand
- *
- * DESCRIPTION: This routine performs the menu command specified.
- *
- * PARAMETERS: command - menu item id
- *
- * RETURNED: nothing
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static Boolean MainFormDoCommand(UInt16 command)
- {
- Boolean handled = false;
- FormPtr frmP;
-
- switch (command)
- {
- case MainOptionsAboutDock:
- MenuEraseStatus(0); // Clear the menu status from the display.
- frmP = FrmInitForm (AboutForm);
- FrmDoDialog (frmP); // Display the About Box.
- FrmDeleteForm (frmP);
- handled = true;
- break;
-
- case MainOptionsRestoreSystemLauncher:
- MenuEraseStatus(0); // Clear the menu status from the display.
- PrefSetPreference(prefLauncherAppCreator,sysFileCLauncher);
- handled = true;
- break;
-
- }
-
- return handled;
- }
-
- template <class T> T * HandleLock(MemHandle h)
- {
- MemPtr p = MemHandleLock(h);
- return reinterpret_cast<T*>(p);
- }
-
- namespace {
-
- MemHandle Duplicate(MemHandle h)
- {
- UInt32 theSize(MemHandleSize(h));
- MemHandle newH(MemHandleNew(theSize));
- MemPtr pNew = MemHandleLock(newH);
- MemPtr pOld = MemHandleLock(h);
- MemMove(pNew, pOld, theSize);
- MemHandleUnlock(newH);
- MemHandleUnlock(h);
- return newH;
- }
-
- }
- static void LoadIcons()
- {
- Boolean newSearch = true;
- DmSearchStateType p = {};
- LocalID localID(0);
- Coord x(0), y(140);
- UInt16 cardNoP;
- while (DmGetNextDatabaseByTypeCreator(newSearch, &p, sysFileTApplication, 0, false, &cardNoP, &localID) == errNone) {
- newSearch = false;
- char dbName[dmDBNameLength];
- UInt32 creator;
- DmDatabaseInfo(0, localID, dbName, 0, 0, 0, 0, 0, 0, 0, 0, 0, &creator);
- gNames.push_back(dbName);
- gCreators.push_back(creator);
- DmOpenRef theDB = DmOpenDatabase(0, localID, dmModeReadOnly);
- MemHandle h(DmGetResource('tAIB', 1001));
- if (h) {
- gSmallIcons.push_back(Duplicate(h));
- DmReleaseResource(h);
- }
- h = DmGetResource('tAIB', 1000);
- if (h) {
- gLargeIcons.push_back(Duplicate(h));
- DmReleaseResource(h);
- }
- DmCloseDatabase(theDB);
- }
- }
-
- static void DrawCentered(const string& s, Coord x, Coord y, Int16 width)
- {
- int textWidth = FntCharsWidth(s.data(), s.length());
- x += (width/2);
- x -= (textWidth/2);
- WinDrawChars(s.data(), s.length(), x, y);
- }
-
- static void DrawIcons()
- {
- gIconLefts.clear();
- Coord x(0), y(159);
- RectangleType r = {0, 0, 160, 160};
- WinEraseRectangle(&r, 0);
- for(int i = 0; i < gSmallIcons.size(); ++i) {
- MemHandle h = gSmallIcons[i];
- Coord height = 9;
- if (i == gTappedIcon) {
- h = gLargeIcons[i];
- height = 22;
- }
- BitmapType* bitMap = HandleLock<BitmapType>(h);
- WinDrawBitmap(bitMap, x, y - height);
- gIconLefts.push_back(x);
- if (i == gTappedIcon) {
- DrawCentered(gNames[i], x, y - height - FntLineHeight() - 2, bitMap->width);
- }
- x += bitMap->width;
- x += 2;
- MemHandleUnlock(h);
- }
- }
-
- static Boolean DoPenDownEvent(EventPtr eventP)
- {
- if (eventP->screenY < 135)
- return false;
-
- for (int i = 0; i < gIconLefts.size()-1; ++i) {
- if (gIconLefts[i] < eventP->screenX && gIconLefts[i+1] > eventP->screenX)
- gTappedIcon = i;
- }
- DrawIcons();
- gDragging = true;
- return true;
- }
-
- static Boolean DoPenMovedEvent(EventPtr eventP)
- {
- if (!gDragging)
- return false;
-
- if (eventP->screenY < 135) {
- gTappedIcon = -1;
- } else {
- for (int i = 0; i < gIconLefts.size()-1; ++i) {
- if (gIconLefts[i] < eventP->screenX && gIconLefts[i+1] > eventP->screenX)
- gTappedIcon = i;
- }
- }
- DrawIcons();
- return true;
- }
-
- static void LaunchTappedIcon()
- {
- AppLaunchWithCommand(gCreators[gTappedIcon], sysAppLaunchCmdNormalLaunch, NULL);
- }
-
- static Boolean DoPenUpEvent(EventPtr eventP)
- {
- if (!gDragging)
- return false;
-
- if (eventP->screenY < 135) {
- gTappedIcon = -1;
- } else {
- for (int i = 0; i < gIconLefts.size()-1; ++i) {
- if (gIconLefts[i] < eventP->screenX && gIconLefts[i+1] > eventP->screenX)
- gTappedIcon = i;
- }
- }
- if (gTappedIcon != -1) {
- LaunchTappedIcon();
- }
- gTappedIcon = -1;
- gDragging = false;
- DrawIcons();
- return true;
- }
-
- /***********************************************************************
- *
- * FUNCTION: MainFormHandleEvent
- *
- * DESCRIPTION: This routine is the event handler for the
- * "MainForm" of this application.
- *
- * PARAMETERS: eventP - a pointer to an EventType structure
- *
- * RETURNED: true if the event has handle and should not be passed
- * to a higher level handler.
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static Boolean MainFormHandleEvent(EventPtr eventP)
- {
- Boolean handled = false;
- FormPtr frmP;
-
- switch (eventP->eType)
- {
- case menuEvent:
- return MainFormDoCommand(eventP->data.menu.itemID);
-
- case penDownEvent:
- return DoPenDownEvent(eventP);
-
- case penMoveEvent:
- return DoPenMovedEvent(eventP);
-
- case penUpEvent:
- return DoPenUpEvent(eventP);
-
- case frmOpenEvent:
- frmP = FrmGetActiveForm();
- MainFormInit( frmP);
- FrmDrawForm ( frmP);
- DrawIcons();
- handled = true;
- break;
-
- default:
- break;
-
- }
-
- return handled;
- }
-
-
- /***********************************************************************
- *
- * FUNCTION: AppHandleEvent
- *
- * DESCRIPTION: This routine loads form resources and set the event
- * handler for the form loaded.
- *
- * PARAMETERS: event - a pointer to an EventType structure
- *
- * RETURNED: true if the event has handle and should not be passed
- * to a higher level handler.
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static Boolean AppHandleEvent(EventPtr eventP)
- {
- UInt16 formId;
- FormPtr frmP;
-
- if (eventP->eType == frmLoadEvent)
- {
- // Load the form resource.
- formId = eventP->data.frmLoad.formID;
- frmP = FrmInitForm(formId);
- FrmSetActiveForm(frmP);
-
- // Set the event handler for the form. The handler of the currently
- // active form is called by FrmHandleEvent each time is receives an
- // event.
- switch (formId)
- {
- case MainForm:
- FrmSetEventHandler(frmP, MainFormHandleEvent);
- break;
-
- default:
- // ErrFatalDisplay("Invalid Form Load Event");
- break;
-
- }
- return true;
- }
-
- return false;
- }
-
-
- /***********************************************************************
- *
- * FUNCTION: AppEventLoop
- *
- * DESCRIPTION: This routine is the event loop for the application.
- *
- * PARAMETERS: nothing
- *
- * RETURNED: nothing
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static void AppEventLoop(void)
- {
- UInt16 error;
- EventType event;
-
- do {
- EvtGetEvent(&event, evtWaitForever);
-
- if (! SysHandleEvent(&event))
- if (! MenuHandleEvent(0, &event, &error))
- if (! AppHandleEvent(&event))
- FrmDispatchEvent(&event);
-
- } while (event.eType != appStopEvent);
- }
-
-
- /***********************************************************************
- *
- * FUNCTION: AppStart
- *
- * DESCRIPTION: Get the current application's preferences.
- *
- * PARAMETERS: nothing
- *
- * RETURNED: Err value 0 if nothing went wrong
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static Err AppStart(void)
- {
- StarterPreferenceType prefs;
- UInt16 prefsSize;
-
- // Read the saved preferences / saved-state information.
- prefsSize = sizeof(StarterPreferenceType);
- if (PrefGetAppPreferences(appFileCreator, appPrefID, &prefs, &prefsSize, true) !=
- noPreferenceFound)
- {
- }
- LoadIcons();
- PrefSetPreference(prefLauncherAppCreator,'Dock');
- return errNone;
- }
-
- inline void MemHandleFreeOp(MemHandle h)
- {
- MemHandleFree(h);
- }
-
- static void FreeHandles(vector<MemHandle>& v)
- {
- std::for_each(v.begin(), v.end(), MemHandleFreeOp);
- }
-
- /***********************************************************************
- *
- * FUNCTION: AppStop
- *
- * DESCRIPTION: Save the current state of the application.
- *
- * PARAMETERS: nothing
- *
- * RETURNED: nothing
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static void AppStop(void)
- {
- StarterPreferenceType prefs;
-
- // Write the saved preferences / saved-state information. This data
- // will be backed up during a HotSync.
- PrefSetAppPreferences (appFileCreator, appPrefID, appPrefVersionNum,
- &prefs, sizeof (prefs), true);
-
- // Close all the open forms.
- FrmCloseAllForms ();
- FreeHandles(gSmallIcons);
- FreeHandles(gLargeIcons);
- }
-
-
- /***********************************************************************
- *
- * FUNCTION: StarterPalmMain
- *
- * DESCRIPTION: This is the main entry point for the application.
- *
- * PARAMETERS: cmd - word value specifying the launch code.
- * cmdPB - pointer to a structure that is associated with the launch code.
- * launchFlags - word value providing extra information about the launch.
- *
- * RETURNED: Result of launch
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- static UInt32 StarterPalmMain(UInt16 cmd, MemPtr /*cmdPBP*/, UInt16 launchFlags)
- {
- Err error;
-
- error = RomVersionCompatible (ourMinVersion, launchFlags);
- if (error) return (error);
-
- switch (cmd)
- {
- case sysAppLaunchCmdNormalLaunch:
- error = AppStart();
- if (error)
- return error;
-
- FrmGotoForm(MainForm);
- AppEventLoop();
- AppStop();
- break;
-
- default:
- break;
-
- }
-
- return errNone;
- }
-
-
- /***********************************************************************
- *
- * FUNCTION: PilotMain
- *
- * DESCRIPTION: This is the main entry point for the application.
- *
- * PARAMETERS: cmd - word value specifying the launch code.
- * cmdPB - pointer to a structure that is associated with the launch code.
- * launchFlags - word value providing extra information about the launch.
- * RETURNED: Result of launch
- *
- * REVISION HISTORY:
- *
- *
- ***********************************************************************/
- UInt32 PilotMain( UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
- {
- return StarterPalmMain(cmd, cmdPBP, launchFlags);
- }
-